#include "EditorScriptFile.h"
#include "EditorTokenGenerator.h"
#include "Document/TextDocument.h"
#include "EditorScriptToken.h"


void REditorScriptFile::BindDocument(TSharedObjectPtr<RTextDocument> InDocument)
{
    TextDocument=InDocument;

    TextDocument->GetPieceTable().OnDocumentChanged
        .BindScript(this, &REditorScriptFile::OnTextChanged);

    //UpdateSyntaxTokens();
}


void REditorScriptFile::OnTextChanged()
{
    // DirtyLines.AddUnique(LineIndex);
    bIsDirty=true;
}

void REditorScriptFile::UpdateSyntaxTokens()
{
    SEditorScriptTokenGenerator TokenGenerator(TextDocument->GetPieceTable().GetText());
    SEditorTokenGenerateResult Result = TokenGenerator.GenerateTokens();
    Tokens=Result.TokenList;

    // static TMap<EEditorScriptTokenType, SColor> TokenColorMap=
    // {
    //     {EEditorScriptTokenType::Unknow, SColor::White},
    //     {EEditorScriptTokenType::Comment, SColor::FromHexRGB(0x6A9955)},
    //     {EEditorScriptTokenType::NormalKeyword, SColor::FromHexRGB(0x569CD6)},
    //     {EEditorScriptTokenType::FlowControlKeyword, SColor::FromHexRGB(0xDA70D6)},
    //     {EEditorScriptTokenType::Operator, SColor::FromHexRGB(0x4EC9B0)},
    //     {EEditorScriptTokenType::LiteralString, SColor::FromHexRGB(0xD69D85)},
    //     {EEditorScriptTokenType::LiteralNumber, SColor::FromHexRGB(0xB5CEA8)},
    //     {EEditorScriptTokenType::Identifier, SColor::FromHexRGB(0x4FC1FF)},
    // };

    // //update the colors
    // Colors.Clear(false);
    // Colors.Reserve(Result.TokenList.Num());
    // for(int64_t i=0; i<Result.TokenList.Num(); i++)
    // {
    //     SColorfulTextColor Color;
    //     Color.StartIndex = Result.TokenList[i].Range.StartCharIndex;
    //     if(TokenColorMap.Contains(Result.TokenList[i].TokenType))
    //     {
    //         Color.Color = TokenColorMap[Result.TokenList[i].TokenType];
    //     }
    //     else
    //     {
    //         Color.Color = TokenColorMap[EEditorScriptTokenType::Unknow];
    //     }
    //     Colors.Add(Color);
    // }
}

void REditorScriptFile::UpdateColors()
{
    //update the colors
    Colors.Clear(false);
    Colors.Reserve(Tokens.Num());
    for(int64_t i=0; i<Tokens.Num(); i++)
    {
        SColorfulTextColor Color;
        Color.StartIndex = Tokens[i].Range.StartCharIndex;
        Color.Color=Tokens[i].Color;
        
        //check if the former color is the same
        if(Colors.Empty() || Colors.Last().Color!=Tokens[i].Color)
        {
            Colors.Add(Color);
        }
    }
}
